iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 9
0
自我挑戰組

打造專案管理 iOS App 系列 第 9

安能取熊掌而捨魚 SnapKit

  • 分享至 

  • xImage
  •  

安能取熊掌而捨魚 SnapKit

自從 Xcode 推出 AutoLayhout 功能後,對於 iOS UI 物件的設定多了一種選擇,但你可能會使用 Storyboard 或是 xib 以圖形化方式來建立,不過,不同 UI 元件的 Constraint 設定有時可能會搞亂整個 Layout。

而使用 NSLayoutConstraint 來做設定卻也可能讓程式碼變得冗長複雜:

let centerHorizontally =
    NSLayoutConstraint(
        item: <#T##Any#>,
        attribute: <#T##NSLayoutConstraint.Attribute#>,
        relatedBy: <#T##NSLayoutConstraint.Relation#>,
        toItem: <#T##Any?#>,
        attribute: <#T##NSLayoutConstraint.Attribute#>,
        multiplier: <#T##CGFloat#>,
        constant: <#T##CGFloat#>)

這時候你或許會思考:

還有其他的 layout 方法嗎?


SnapKit,一個經典的Swift版的第三方庫,專門用於項目的autoLayout,目前在github上的stars就高達16.9顆星,這是一個不小的數字,亦足以證明它存在的非凡意義和作用。作者認為,在iOS開發(swift)中,它是用於項目最優秀的自動佈局的必選庫之一。它的作者仍然是寫Objective-C的第三方庫Masonry的大神 - @Robert Payne

基本用法

SnapKit設計為非常易於使用。假設我們要佈局一個框,該框使用20pts的填充限製到其superview的邊緣。

let box = UIView()
superview.addSubview(box)

box.snp.makeConstraints { (make) -> Void in
    make.top.equalTo(superview).offset(20)
    make.left.equalTo(superview).offset(20)
    make.bottom.equalTo(superview).offset(-20)
    make.right.equalTo(superview).offset(-20)
}

你不難發現,有很多重複的代碼

因此,你還可以繼續簡寫。

let box = UIView()
superview.addSubview(box)

box.snp.makeConstraints { (make) -> Void in
    make.edges.equalTo(superview).inset(UIEdgeInsetsMake(20, 20, 20, 20))
}

ViewAttribute 對照

對照條件

你也可以設定固定的值

// width >= 200 && width <= 400
make.width.greaterThanOrEqualTo(200)
make.width.lessThanOrEqualTo(400)

但是,“autoLayout”不允許將對齊屬性(如left,right,centerY等)設置為常數。

您還可以使用其他原語和結構來構建約束,如下所示:

make.top.equalTo(42)
make.height.equalTo(20)
make.size.equalTo(CGSize(width: 50, height: 100))
make.edges.equalTo(UIEdgeInsets(top: 10, left: 0, bottom: 10, right: 0))
make.left.equalTo(view).offset(UIEdgeInsets(top: 10, left: 0, bottom: 10, right: 0))

優先順序

make.top.equalTo(label.snp.top).priority(600)

你也可以使用快捷鍵的優先級:
.low,.medium,.high,.required。

make.top.equalTo(label.snp.top).priority(.medium)

snapKit 還有一些更進階的用法,可以更加容易的更新,刪除約束這些用法我會再整理一篇文章跟大家分享。


上一篇
安能取熊掌而舍魚? Swift 純 Code 之 view 與 controller分離
下一篇
夢的伊甸園還在那邊 與 Don meeting
系列文
打造專案管理 iOS App 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
MarkFly~
iT邦新手 4 級 ‧ 2022-08-13 14:34:49

16.9顆星XD

我要留言

立即登入留言